package E_2024;

import java.util.Arrays;

/*
    【字符统计及重排】
    给出一个仅包含字母的字符串，不包含空格，统计字符串中各个字母(区分大小写)出现的次数，并按照字母出现次数从大到小的顺序输出各个字母及
    其出现次数。如果次数相同，按照自然顺序进行排序，且小写字母在大写字母之前。
输入描述:
    输入一行，为一个仅包含字母的字符串。
输出描述:
    按照字母出现次数从大到小的顺序输出各个字母和字母次数，用英文分号分隔，注意末尾的分号;字母和次数间用英文冒号分隔。
示例：
    1.输入：
    xyxyXX
    输出：x:2;y:2;X:2;
    说明：
    每个字符出现的次数为2 故x排在y之前，而小写字母x在大写X之前
    2.输入：
    abababb
    输出：b:4;a:3
    说明：

    b的出现个数比a多 故排在a前
 */
public class E_100_60 {
    public static void main(String[] args) {
        ans("xyxyXX");
        ans("abbbabccc");
    }
    public static void ans(String str){
        int[][] temp = new int['z'-'A'][2];
        for (int i = 0; i < str.length(); i++) {
            char ch = str.charAt(i);
            temp[ch-'A'][0] = ch;
            temp[ch-'A'][1]++;
        }
        Arrays.sort(temp,(a,b)->{
            if (a[1] == b[1] && ( a[0] <= 'a' || b[0] <= 'a' )){
                return b[0] - a[0];
            }
            return b[1] - a[1];
        });
        StringBuilder sb = new StringBuilder();
        for (int[] x : temp) {
            if (x[1] != 0)
                sb.append((char) (x[0])).append(":").append(x[1]).append(";");
        }
        System.out.println(sb.toString());
    }
}
